package com.kjlink.widget.linkapp;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

/**
 * 描述:
 *
 * @author Vic.xu
 * @since 2025-09-03 10:51
 */
public class FileMoveTest {





    /**
     * 按规则移动文件
     * 规则: 目标路径 = 源文件的一级目录 + target(可多层) + 源文件全路径
     *
     * @param filePath 源文件路径（绝对路径）
     * @param target   目标目录（相对路径: "moves"、"moves/archive"，或带 "/" 的 "/moves"）
     * @return 移动后的目标文件路径（字符串）
     * @throws IOException IO异常
     */
    public static String moveWithCustomRule(String filePath, String target) throws IOException {
        Path source = Paths.get(filePath);
        //  获取目标目镜
        Path finalTarget = getTargetPath(source, target);
        // 确保目标目录存在
        Files.createDirectories(finalTarget.getParent());
        // 移动文件
        Files.move(source, finalTarget, StandardCopyOption.REPLACE_EXISTING);
        return finalTarget.toString();
    }

    /**
     * 根据源文件路径和目标目录，计算目标文件的最终路径
     *
     * 规则: 目标路径 = 源文件的一级目录 + target(可多层) + 源文件全路径
     *
     * @param source 源文件
     * @param target   目标目录（相对路径: "moves"、"moves/archive"，或 "/moves"）
     * @return 目标文件的最终路径
     */
    public static Path getTargetPath(Path source, String target) {
        // 磁盘根目录 (Windows 下是 C:\，Linux 下是 /)
        Path root = source.getRoot();
        // 一级目录 (例如 fms)
        Path firstLevel = source.getName(0);
        // 源文件相对路径 (例如 fms/fmsfiles/ImplContractCondiHK/file.docx)
        Path relative = source.subpath(0, source.getNameCount());
        // 处理目标目录，去掉前导斜杠，确保是相对路径
        String cleanTarget = target.replaceFirst("^[/\\\\]+", "");
        Path targetPath = Paths.get(cleanTarget);
        // 拼接目标路径
        return root.resolve(firstLevel).resolve(targetPath).resolve(relative);
    }


    public static void main(String[] args) throws IOException {
        String src = "D:/temp/case/A.txt";

        System.out.println("Moved to: " + moveWithCustomRule(src, "moves"));
//        System.out.println("Moved to: " + moveWithCustomRule(src, "moves/archive"));
//        System.out.println("Moved to: " + moveWithCustomRule(src, "/moves"));

    }
}
